Sequence Animation Code Read —— Dragon Flight/Blade Fury Fpa 顺序动作代码解析 —— 飞龙在天/刃之怒帧数
By Louis-J 本帖出自 [url=http://til.sggo.cn/]光耀者-混沌要塞
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓粗旷威猛的分割线〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
D2中有些动作属于顺序动作,如Dragon Flight,它的动作帧数由于在.dll中记录,所以一直难以下手。 直到有一天偶尔发现Hammerman在PK出现([url=http://til.sggo.cn/showthread.php?t=6239]Hammerman 重返D2 ),在离开D2两年多后,我们的Tech Guru复出了。
依靠Hammerman在Phrozen Keep提供的相关.DLL信息[url=http://phrozenkeep.it-point.com/forum/viewtopic.php?t=34744]Player sequence table, 我试着解析下Dragon Flight的帧数。
Dragon Flight
CF Skills.txt 顺序动作技能列表 Seqnum Skill 1 Jab 2 Sacrifice 3 n/a 4 Charge 5 Conviction 6 Inferno 7 n/a 8 Impale 9 Fend 10 Whirlwind 11 Frenzy, Double Swing 12 Chain Lightning, Lightning 13 Leap 14 Leap Attack 15 Double Throw 16 Fists of Fire, Dragon Claw, Claws of Thunder,Blades of Ice 17 n/a 18 Arctic Blast 19 Dragon Talon 20 n/a 21 Dragon Flight 22 Wearwolf/bear 23 Blade Fury
CF WeaponClass.txt 武器类型列表 WeaponClass_____________code Hand To Hand____________hth_____0 1 Hand Thrust___________1ht_____1 2 Hand Thrust___________2ht_____2 1 Hand Swing____________1hs_____3 2 Hand Swing____________2hs_____4 Bow_____________________bow_____5 Crossbow________________xbw_____6 Staff___________________stf_____7 Left Jab Right Swing____1js_____8 Left Jab Right Thrust___1jt_____9 Left Swing Right Swing__1ss_____10 Left Swing Right Thrust_1st_____11 One Hand-to-Hand________ht1_____12 Two Hand-to-Hand________ht2_____13
CF PlrMode.txt 角色动作类型列表 Name____________Token___Code Death___________DT______DT______0 Neutral_________NU______NU______1 Walk____________WL______WL______2 Run_____________RN______RN______3 Get Hit_________GH______GH______4 Town Neutral____TN______TN______5 Town Walk_______TW______TW______6 Attack1_________A1______A1______7 Attack2_________A2______A2______8 Block___________BL______BL______9 Cast____________SC______SC______10 Throw___________TH______TH______11 Kick____________KK______KK______12 Skill1__________S1______S1______13 Skill2__________S2______S2______14 Skill3__________S3______S3______15 Skill4__________S4______S4______16 Dead____________DD______DD______17 Sequence________GH______SQ______18 Knock back______GH______KB______19
≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈清新脱俗的分割线≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
SQ动作在D2Common.dll中的地址是6FDEE248 CF D2Common.6FDEE248 6FDEE248 00 00 00 00 00 C7 DE 6F 6FDEE250 08 C8 DE 6F 10 C9 DE 6F 6FDEE258 18 CA DE 6F E8 CA DE 6F 6FDEE260 F0 CB DE 6F 60 CD DE 6F 6FDEE268 18 CF DE 6F 80 D0 DE 6F 6FDEE270 58 D1 DE 6F 68 D2 DE 6F 6FDEE278 88 D3 DE 6F 90 D4 DE 6F 6FDEE280 A8 D7 DE 6F 98 D8 DE 6F 6FDEE288 E8 D9 DE 6F 08 DB DE 6F 6FDEE290 30 DD DE 6F 28 DC DE 6F 6FDEE298 40 DE DE 6F 78 DF DE 6F 6FDEE2A0 80 E0 DE 6F A0 E1 DE 6F 代码:对照顺序动作技能列表得到各技能的地址 Address: 6FDEE248 +00 = 6FDEC700 1 Jab +04 = 6FDEC808 2 Sacrifice +08 = 6FDEC910 3 n/a +0C = 6FDECA18 4 Charge +10 = 6FDECAE8 5 Conviction +14 = 6FDECBF0 6 Inferno +18 = 6FDECD60 7 n/a +1C = 6FDECF18 8 Impale +20 = 6FDED080 9 Fend +24 = 6FDED158 10 Whirlwind +28 = 6FDED268 11 Frenzy, Double Swing +2C = 6FDED388 12 Chain Lit., Lightning +30 = 6FDED490 13 Leap +34 = 6FDED7A8 14 Leap Attack +38 = 6FDED898 15 Double Throw +3C = 6FDED9E8 16 Elem. chargeup skills +40 = 6FDEDB08 17 n/a +44 = 6FDEDD30 18 Arctic Blast +48 = 6FDEDC28 19 Dragon Talon +4C = 6FDEDE40 20 n/a +50 = 6FDEDF78 21 Dragon Flight +54 = 6FDEE080 22 Wearwolf/bear +58 = 6FDEE1A0 23 Blade Fury 可见Dragon Flight的地址是6FDEDF78。
CF D2Common.6FDEDF78 6FDEDF78 E8 DE DE 6F 17 00 00 00 6FDEDF80 17 00 00 00 E8 DE DE 6F 6FDEDF88 17 00 00 00 17 00 00 00 6FDEDF90 E8 DE DE 6F 17 00 00 00 6FDEDF98 17 00 00 00 E8 DE DE 6F 6FDEDFA0 17 00 00 00 17 00 00 00 6FDEDFA8 E8 DE DE 6F 17 00 00 00 6FDEDFB0 17 00 00 00 E8 DE DE 6F 6FDEDFB8 17 00 00 00 17 00 00 00 6FDEDFC0 E8 DE DE 6F 17 00 00 00 6FDEDFC8 17 00 00 00 E8 DE DE 6F 6FDEDFD0 17 00 00 00 17 00 00 00 6FDEDFD8 E8 DE DE 6F 17 00 00 00 6FDEDFE0 17 00 00 00 E8 DE DE 6F 6FDEDFE8 17 00 00 00 17 00 00 00 6FDEDFF0 E8 DE DE 6F 17 00 00 00 6FDEDFF8 17 00 00 00 E8 DE DE 6F 6FDEE000 17 00 00 00 17 00 00 00 6FDEE008 E8 DE DE 6F 17 00 00 00 6FDEE010 17 00 00 00 E8 DE DE 6F 6FDEE018 17 00 00 00 17 00 00 00 代码: Address: 6FDEDF78 Dragon Flight +00 = <wclass 0> 6FDEDEE8 +04 = 00000017 +08 = 00000017 6FDEDF84 = <wclass 1> 6FDEDEE8 +04 = 00000017 +08 = 00000017 . . . 6FDEE014 = <wclass 13> 6FDEDEE8 +04 = 00000017 +08 = 00000017 14种武器类型调用的是同一个地址6FDEDEE8的动作记录。
CF D2Common.6FDEDEE8 6FDEDEE8 00 00 0A 00 00 00 00 00 6FDEDEF0 0A 01 00 00 00 00 0A 02 6FDEDEF8 00 00 00 00 0A 03 00 00 6FDEDF00 00 00 0A 04 00 00 00 00 6FDEDF08 0A 05 00 00 00 00 0A 06 6FDEDF10 00 00 00 00 0A 07 00 00 6FDEDF18 00 00 0A 08 00 00 00 00 6FDEDF20 0A 09 00 01 00 00 0C 00 6FDEDF28 00 00 00 00 0C 01 00 00 6FDEDF30 00 00 0C 02 00 00 00 00 6FDEDF38 0C 03 00 00 00 00 0C 04 6FDEDF40 00 01 00 00 0C 05 00 00 6FDEDF48 00 00 0C 06 00 00 00 00 6FDEDF50 0C 07 00 00 00 00 0C 08 6FDEDF58 00 00 00 00 0C 09 00 00 6FDEDF60 00 00 0C 0A 00 00 00 00 6FDEDF68 0C 0B 00 00 00 00 0C 0C 6FDEDF70 00 00 00 00 00 00 00 00 代码: Address: 6FDEDEE8 +00 = <frame 1> byte, 00 +01 = byte, 00, ? +02 = byte, 0A, 调用的动作类型为10(16进制A->10进制10),即为SC(Cast)施法动作 +03 = byte, 00, 动作帧数显示 +04 = byte, 00, ? +05 = byte, 00, 动作标记(01表示有) 6FDEDEEE +00 = <frame 2> byte, 00 +01 = byte, 00, ? +02 = byte, 0A +03 = byte, 01 +04 = byte, 00, ? +05 = byte, 00 . . . 6FDEDF1E +00 = <frame 10> byte, 00 +01 = byte, 00, ? +02 = byte, 0A +03 = byte, 09 +04 = byte, 00, ? +05 = byte, 01, SC动作 6FDEDF24 +00 = <frame 11> byte, 00 +01 = byte, 00, ? +02 = byte, 0C, 调用的动作类型为0C(16进制C->10进制12),即为KK(Kick)踢击动作 +03 = byte, 00, +04 = byte, 00, ? +05 = byte, 00 . . . 6FDEDF3C +00 = <frame 15> byte, 00 +01 = byte, 00, ? +02 = byte, 0C +03 = byte, 04 +04 = byte, 00, ? +05 = byte, 01, KK动作 6FDEDF42 +00 = <frame 16> byte, 00 +01 = byte, 00, ? +02 = byte, 0C +03 = byte, 05 +04 = byte, 00, ? +05 = byte, 00,
. . . 6FDEDF6C +00 = <frame 23> byte, 00 +01 = byte, 00, ? +02 = byte, 0C +03 = byte, 0C +04 = byte, 00, ? +05 = byte, 00, 整个动作在这里结束
转换为下面的动作帧数列表
Frame Mode No. flag # +00 +01 +02 +03 +04 +05 0 0 0 10 0 0 0 1 0 0 10 1 0 0 2 0 0 10 2 0 0 3 0 0 10 3 0 0 4 0 0 10 4 0 0 5 0 0 10 5 0 0 6 0 0 10 6 0 0 7 0 0 10 7 0 0 8 0 0 10 8 0 0 9 0 0 10 9 0 1 10 0 0 12 0 0 0 11 0 0 12 1 0 0 12 0 0 12 2 0 0 13 0 0 12 3 0 0 14 0 0 12 4 0 1 15 0 0 12 5 0 0 16 0 0 12 6 0 0 17 0 0 12 7 0 0 18 0 0 12 8 0 0 19 0 0 12 9 0 0 20 0 0 12 10 0 0 21 0 0 12 11 0 0 22 0 0 12 12 0 0
可以得到Dragon Flight的总的FramePerDirection为23 相关参数: SCFramePerDirection: 10 SCFrameDataActionFlag: 9 KKFramePerDirection: 13 KKFrameDataActionFlag: 4
Frames Per Attack = SCFrames + KKFrames
SCFrames = {256*(SCFramePerDirection) / [AnimationSpeed*(BaseRate+EFCR)/100]} SCActionFrames = {256*(SCFrameDataActionFlag+1) / [AnimationSpeed*(BaseRate+EFCR)/100]}
KKFrames = {256*(KKFramePerDirection) / [AnimationSpeed*(BaseRate+SpeedIncrease)/100]} KKActionFrames = {256*(KKFrameDataActionFlag+1) / [AnimationSpeed*(BaseRate+SpeedIncrease)/100]}
≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈清新脱俗的分割线≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
然而,我们是否就依据上面的公式得到多少FCR,多少IAS时,DF的帧数?
CF Skills.txt 代码: skill: Dragon Flight anim: SQ —— sequence 顺序动作 seqtrans: A1 —— 顺序动作的转换为Attack1动作?我的理解,就是顺序动作转换之前的动作速度取决于与Attack1相关的因素,即AttackRate seqnum: 21 —— SQ动作的号码 seqinput: 0 —— ? UseAttackRate: 0 —— AttackRate不能影响它的速度 注:AttackRate是影响攻击速度的参数
从这里得到的讯息是在Dragon Flight踢击动作前是一个施法动作,但是这个施法动作的速度取决于Attack1动作,由于UseAttackRate = 0,所以没什么能影响它的施法速度和踢击速度。
那么上面的公式可以简化为:
Frames Per Attack = SCFrames + KKFrames
SCFrames = {256*(SCFramePerDirection) / [AnimationSpeed*(BaseRate)/100]} SCActionFrames = {256*(SCFrameDataActionFlag+1) / [AnimationSpeed*(BaseRate)/100]} SCFramePerDirection: 10 SCFrameDataActionFlag: 9 AnimationSpeed: 256 BaseRate: 100
KKFrames = {256*(KKFramePerDirection) / [AnimationSpeed*(BaseRate)/100]} KKActionFrames = {256*(KKFrameDataActionFlag+1) / [AnimationSpeed*(BaseRate)/100]} KKFramePerDirection: 13 KKFrameDataActionFlag: 4 AnimationSpeed: 256 BaseRate: 100
Dragon Flight施展动作(飞行)帧数 +--------+--------------+ |SCFrames|SCActionFrames| +--------+--------------+ | 10 | 10 | +--------+--------------+
Dragon Flight踢击动作帧数 +--------+--------------+ |KKFrames|KKActionFrames| +--------+--------------+ | 13 | 5 | +--------+--------------+ 注: SCActionFrames = 9 表示施法动作发生在第10帧,之前为9帧发行时间; KKActionFrames = 4 表示踢击发生在第15帧,之前为4帧的出腿时间,之后为8帧的收腿时间。
Dragon Flight Fpa = SCFrames + KKFrames = 10 + 13 = 23 frames
即Dragon Flight整个攻击动作固定为23帧,并且无任何因素能影响它,包括Slow效果。
≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈清新脱俗的分割线≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
游戏实际测试 Mod使Dragon Flight没有1秒的施法延迟,计算在30秒(750帧)内对同一目标的踢击次数。 如果正确的话,不管如何变化FCR/WSM/IAS/BOS Lvl等,都应该得到 [750÷23] = 32次。 果然无论如何变换状态,都得到固定的32次踢击。 可以肯定的说,以上的代码解析是正确的。
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓粗旷威猛的分割线〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
Blade Fury
同样的解析方法,对于Blade Fury。
CF Skills.txt 代码: skill: Blade Fury anim: SQ seqtrans: A1 seqnum: 23 seqinput: 12 UseAttackRate: 0
CF D2Common.dll
WeaponClass: ALL Frame Mode No. flag # +00 +01 +02 +03 +04 +05 0 0 0 10 0 0 0 1 0 0 10 1 0 0 2 0 0 10 2 0 0 3 0 0 10 3 0 0 4 0 0 10 4 0 0 5 0 0 10 5 0 0 6 0 0 10 6 0 0 7 0 0 10 7 0 0 8 0 0 10 8 0 0 9 0 0 10 9 0 0 10 0 0 10 9 0 0 11 0 0 10 9 0 0 12 0 0 10 10 0 1 13 0 0 10 11 0 0 14 0 0 10 12 0 0 15 0 0 10 13 0 0 16 0 0 10 14 0 0 17 0 0 10 15 0 0 18 0 0 10 16 0 0 KKFramePerDirection: 19 KKFrameDataActionFlag: 12 AnimationSpeed: 256 BaseRate: 100
+------+------------+ |Frames|ActionFrames| +------+------------+ | 19 | 13 | +------+------------+
即Blade Fury一次发标动作固定为19帧(从游戏中看就是发两标这个动作),同Dragon Flight一样,无任何因素能影响它。
注:Blade Fury固定每6帧1标,即每标间隔5帧(当然,如Slow Missiles还是可以影响它的)。 CF Skills.txt Param4: 5 *Param4 Description: Frame delay between blades
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓粗旷威猛的分割线〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
[ 本贴由 Louis-J 在 05-16 00:35 编辑过. ] |